package cn.jjxx.modules.sys.service;

import java.util.List;

import cn.jjxx.core.common.entity.ZtreeEntity;
import cn.jjxx.core.common.service.ITreeCommonService;
import cn.jjxx.core.query.wrapper.EntityWrapper;
import cn.jjxx.modules.sys.entity.Organization;

/**
 * @Title:
 * @Description:
 * @author jwcg
 * @date 2014-12-20 21:33:51
 * @version V1.0
 *
 */
public interface IOrganizationService extends ITreeCommonService<Organization, String> {
	/**
	 * 通过用户ID查找组织
	 */
	public List<Organization> findListByUserId(String userId);
	/**
	 * 
	 * @Description: 根据组织ID查询所有子组织
	 * @param @param orgid
	 * @param @return .  
	 * @return List<Organization> .
	 * @author 周恺 
	 * @date 2017年11月7日 下午3:57:34
	 */
	public List<Organization> findsubById(String orgId);
	
	/**
	 * 
	 * @Description: 查询wbs树 
	 * @param @param entityWrapper
	 * @param @return .  
	 * @return List<Organization> .
	 * @author 周恺 
	 * @date 2017年11月23日 上午11:48:29
	 */
	public List<Organization> selectWbsTreeList(
			EntityWrapper<Organization> entityWrapper);
	
	/**
	 * @Description: 根据控制类型，获取当前节点最符合条件的上级组织 .<br>
	 * @param orgId 当前组织Id.<br>
	 * @param types 包含类型.<br>
	 * @param isLocal 是否包含本级.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-7-4 下午2:22:09.<br>
	 */
	public Organization getRecentlyParent(String orgId,List<String> types,boolean isLocal);
	
	/**
	 * @Description: 根据控制类型获取距离当前节点最近的组织 .<br>
	 * @param orgId 组织Id.<br>
	 * @param types 包含类型.<br>
	 * @param isLocal 是否包含本级.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-7-4 下午2:19:53.<br>
	 */
	public List<Organization> getRecentlyChild(String orgId,List<String> types,boolean isLocal);
	
	/**
	 * @Description: 获取具有权限的组织树集合.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-8-28 上午11:12:52.<br>
	 */
	List<ZtreeEntity> getOrgTree();
	
	/**
	 * @Description: 将菜单组合成组织树 .<br>
	 * @param orgs 组织集合.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-8-28 上午11:14:00.<br>
	 */
	List<ZtreeEntity> getOrgTree(List<Organization> orgs);
	
	/**
	 * @Description: 一次性获取菜单组织集合 .<br>
	 * @param menuId 菜单Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-8-28 上午11:14:00.<br>
	 */
	List<Organization> getPermisOrgs(String menuId);
	
	/**
	 * @Description: 一次性获取菜单组织集合 .<br>
	 * @param 组织控制类型集合.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-8-28 上午11:14:00.<br>
	 */
	List<Organization> getPermisOrgs(String[] types);
	
	/**
	 * @Description: 根据菜单，获取组织包含的菜单类型 .<br>
	 * @param menuId 菜单Id.<br>
	 * @author zcg .<br>
	 * @date 2018-3-30 下午5:55:22.<br>
	 */
	List<String> getOrgIds(String menuId);
	
	/**
	 * @Description: 获取父组织结合的子组织集合 .<br>
	 * @param parentsList 父组织集合.<br>
	 * @param permisOrgIds 权限组织集合.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-8-21 下午4:07:10.<br>
	 */
	List<Organization> getChildrenList(List<Organization> parentsList,List<String> permisOrgIds);
	
	/**
	 * @Description: 检测是否有父级 .<br>
	 * @param parent 父级.<br>
	 * @param childrens 孩子节点.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-8-21 下午4:07:58.<br>
	 */
	boolean hasChildren(Organization parent, List<Organization> childrens);
	
	/**
	 * @Description: 根据组织控制类型，获取组织Id .<br>
	 * @param types 组织控制类型集合.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-9-20 下午5:41:14.<br>
	 */
	List<String> getOrgIds(String[] types);
	
	/**
	 * @Description: 根据组织集合和组织Id,获取组织实体类 .<br>
	 * @param orgs 组织集合.<br>
	 * @param id 组织Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-11-8 上午9:51:15.<br>
	 */
	Organization getOrganization(List<Organization> orgs,String id);
}
